package loacalclass;
/*
    局部内部类的成员访问:
        1. 内部类中访问成员:
            a. 访问不同名成员变量: 作用域
            b. 访问同名成员变量: 就近原则
            c. 强制访问外部类成员变量 : Outer.this.变量名;
            d. 可以无阻碍的访问外部类的方法和本类的方法
            e. 强制访问外部类的同名方法 : Outer.this.方法名(实参);
        2. 第三方类中访问内部类的成员 : 不可以,只能在方法内创建局部内部类对象
            new Outer().new Inner() -> 创建成员内部类的对象
            new Outer.Inner() -> 创建静态成员内部类的对象

 */
public class Demo {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //多态
        //左边是父类型 = 右边inner子类型
        Object obj = outer.classMethod();
        //Inner inner = (Inner) obj;
        //obj.function();
    }
}

//外部类
class Outer{
    int numOut = 100;
    int num = 111;
    public void methodOut(){
        System.out.println("methodOut");
    }
    public void method(){
        System.out.println("外部类的method");
    }

    public Object classMethod(){

        //局部内部类
        class Inner{
            //内部类的成员
            int numIn = 200;
            int num = 222;
            public void methodIn(){
                System.out.println("methodIn");
            }
            public void method(){
                System.out.println("内部类的method");
            }

            public void function(){
                System.out.println("numIn = " + numIn);
                System.out.println("numOut = " + numOut);
                System.out.println("num = " + num);
                System.out.println(Outer.this.num);//外部类的num
                System.out.println("--------------");
                methodIn();
                methodOut();
                this.method();
                Outer.this.method();
            }
        }

        //创建局部内部类的对象
        Inner inner = new Inner();
        inner.function();

        return inner;
    }
}
